/**
 * https://www.bilibili.com/video/BV1vs411n7TH?p=41
 * 数组定义, C数组 "越界" 可能会报错(当读到"不允许读"的内存时报错), 但是结果不对
 *    数据类型 数组名[元素个数] = {值1, 值2, 值3};
 */
#include <stdio.h>

#define SIZE 9

void arrayCaculate();
void arrayReverse();
void bubble_sort();

//C 数组, c语言[n]在变量后面
int main() {
    int c[SIZE];           //√ 正确
    int d[9];  d[0] = 1;   //√ 可以这样赋值!!, d[1]~d[8]未初始化, 默认 = -858993460(0xcccccccc 是这个16进制?)
    int e[ ] = { 0 };      //√ 也可以,  长度=1,  e[0] = 0
    int f[9] = { 0 };      //所有元素 = 0
    int g[9] = { 1 };      //第1个是 1, 后面全是 0
    int h[9] = { 1, 2, 3 };//定义前3个值, 后面全是 0
    int k[ ] = { 1, 2, 3 };//可不写元素个数, 但必须写{}内容,  长度=3

    //C 错误定义示范
    int m = 10;  static const int n = 10;
    int o[ ] = { };     //(CLion不报错) Visual Studio报错, 个数&值都没定义
    int p[m];           //(CLion不报错) Visual Studio报错, 数组个数必须是常量.
    int q[n];           //(CLion不报错) Visual Studio报错, const 也不行, 加上 static 也不行.

    printf("sizeof(o) = %d\n", sizeof(o));//0
    printf("sizeof(p) = %d\n", sizeof(p));//40
    printf("sizeof(q) = %d\n", sizeof(q));//40

    //数组内元素 参与计算
    arrayCaculate();
    //数组逆序
    arrayReverse();
    bubble_sort();
}


int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//1.数组内元素 参与计算
void arrayCaculate() {
    arr[3] = arr[5];    //6
    arr[2] = arr[3] * 2;//12
    printf("arr参与位置交换运算后: ");
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);  //1 2 12 6 5 6 7 8 9 10
    }
    printf("\n\n");

    const char array[] = "Hello";
//    array = NULL;         //const修饰, 不能更改指针地址
//    array[0] = 'h';       //const修饰, 不能更改值

    //2.数组在内存中存储方式&大小
    printf("&arr = %p\n", &arr);          //012FF690
    printf("&arr[0] = %p\n", &arr[0]);    //012FF690
    printf("&arr[1] = %p\n", &arr[1]);    //012FF694(和上方差 int 的 4个byte)
    printf("&arr[2] = %p\n", &arr[2]);    //012FF698
    printf("sizeof(arr) = %d\n\n", sizeof(arr));  //40 (4*10)
}

//3.数组逆序
void arrayReverse() {
    int i = 0, temp;
    int count = sizeof(arr) / sizeof(arr[0]);//一共多少元素
    int j = count - 1;
    while (i < j) {
        temp = arr[i];
        arr[i] = arr[j];    //不能写成: arr[i++] = arr[j], 会报错, 原因未知???
        arr[j] = temp;      //不能写成: arr[j++] = temp, 会报错, 原因未知???
        i++;
        j--;
    }
    printf("数组逆序: ");
    for (int k = 0; k < count; ++k) {
        printf("%d ", arr[k]);
    }
    printf("\n\n");
}

/**
 * 4.数组 冒泡排序 (越小的元素会经由交换慢慢“浮”到数列的顶端)
 *   https://www.bilibili.com/video/BV1vs411n7TH?p=45
 *   第1、2比较,  第2、3比较，  第3、4比较  ...  第9、10比较: 最大值放到了最后面
 *   第1、2比较,  第2、3比较，  第3、4比较  ...  第8、9比较: 第2大值放到了倒数第2位
 *   ...
 */
#include "../Utils/SortUtils.c"
void bubble_sort() {
    int arr[SIZE] = {8, 2, 0, 5, 7, 1, 6, 3, 9, 4};
    //SortUtils.c 的方法.
    bubbleSort(arr, SIZE);

    printf("数组冒泡排序后: ");
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", arr[i]);
    }
}